package framework.elements;

import java.util.List;
import java.util.Random;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;

/**
 * Класс, описывающий комбобокс (выпадающий список)
 */
public class ComboBox extends BaseElement {

	public ComboBox(final By locator, final String name) {
		super(locator, name);
	}

	protected String getElementType() {
		return "Комбобокс";
	}

	/**
	 * Проверить наличие комбобокса и получить выбранное значение (label)
	 */
	public String getSelectedLabel() {
		assertIsPresent();
		return new Select(element).getFirstSelectedOption().getText();
	}

	/**
	 * Проверяет выбранное значение текстбокса
	 * 
	 * @param value
	 *            значение
	 */
	public void assertSelectedText(String value) {
		waitAndAssertIsPresent();
		String actual = getSelectedText();
		jassert.assertText(getName(), value, actual, true);
	}

	/**
	 * Выбрать значение из списка
	 * 
	 * @param optionLocator
	 *            Локатор значения, которое необходимо выбрать
	 */
	public void select(String optionLocator) {
		waitAndAssertIsPresent();
		info(String.format("Выбрираемое значение '%1$s'", optionLocator));
		new Select(element).selectByVisibleText(optionLocator);
	}

	public void selectByText(String value) {
		waitAndAssertIsPresent();
		info(String.format("Выбрираемое значение '%1$s'", value));
		new Select(element).selectByVisibleText(value);
	}

	public void selectByValue(String value) {
		waitAndAssertIsPresent();
		info(String.format("Выбрираемое значение '%1$s'", value));
		new Select(element).selectByValue(value);
	}

	public String getSelectedText() {
		waitAndAssertIsPresent();
		return (new Select(element)).getFirstSelectedOption().getText();
	}

	/**
	 * Выбирает первое доступное значение из комбобокса
	 * 
	 * @return выбранное значение
	 */
	public String selectRandomValue() {
		String text = "";
		waitAndAssertIsPresent();
		Select select = new Select(element);
		List<WebElement> options = select.getOptions();
		// Проверка, что выпадающий список не пуст
		if (options.size() == 1
				&& (options.get(0).getText().equals("") || options.get(0)
						.getText().equals("Не выбрано"))) {
			fatal("Выпадающий список пуст!");
		} else if (options.size() == 1) {
			text = options.get(0).getText();
		} else {
			int index = new Random().nextInt(options.size() - 1) + 1;
			text = options.get(index).getText();
		}
		info("Выбираемое значение из выпадающего списка: '" + text + "'");
		select.selectByVisibleText(text);
		return text;
	}

}
